#include "TcpServer.hpp"
#include <memory>
// #include"Command.hpp"
#include "Protocol.hpp"
#include "Calculator.hpp"
#include"Daemon.hpp"

using namespace LogModule;

using cal_fun = std::function<Responce(const Request& req)>;

// 解析模块
class Parse
{
public:
	Parse(cal_fun c) 
		:_cal(c)
	{}
	std::string Entry(std::string &package)
	{
		// 1. 判断报文的完整性
		std::string message;
		std::string respstr;
		while (Decode(package, &message))
		{
			LOG(LogLevel::DEBUG) << "content:\n" << message;
			if (message.empty())
				break;

			// 2.反序列化,message是一个曾经被序列化的request
			Request req;
			if (!req.Deserilze(message))
				break;
						
			std::cout << "###############" << std::endl;
			req.Print();
			std::cout << "###############" << std::endl;


			// 3.计算
			//Responce resp = gcal.Excute(req);
			Responce resp = _cal(req);

			// 4.序列化
			std::string res;
			resp.Serialize(res);
			LOG(LogLevel::DEBUG) << "序列化：\n" << res;


			// 5.添加长度报头字段
			Encode(res);
			LOG(LogLevel::DEBUG) << "Encode:\n" << res;

			// 6.拼接应答
			respstr += res;
		}
		LOG(LogLevel::DEBUG) << "respstr:\n" << respstr;

		return respstr;
	}

private:
	cal_fun _cal;
};

int main()
{
	ENABLE_CONSOLE_LOG();
	//ENABLE_FILE_LOG();

	//Daemon(false,false);

	// 1.计算模块
	Calulator mycal;
	// 2.解析对象
	Parse myparse([&mycal](const Request& req){
		return mycal.Excute(req);
	});

	// 3.通信模块 -- 只负责IO
	std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>([&myparse](std::string &package){
		return myparse.Entry(package);
	});

	tsvr->InitServer();
	tsvr->Start();

	return 0;
}